package demo2;

import com.sun.deploy.uitoolkit.impl.fx.AppletStageManager;

//在面向对象的概念中，所有的对象都是通过类来描述的，
// 但是反过来，不是所有的类都可以用来描绘对象的，
// 如果一个类中没有包含足够的信息来描绘一个具体的
// 对象，那么这样的类就是抽象类
public class Test {
    public static void drawMap (Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {

    }

}

//协变类型：返回值是父子关系
//抽象类和普通类有什么区别
//抽象类不能实例化
//抽象类可以有抽象方法和普通方法
//普通类不能有抽象方法
//抽象类用关键字abstract修饰
abstract class Shape {
//    public void draw() {
//        System.out.println("draw");
//    }
// 方法加上abstract就可以不具体实现

//    public abstract void func() {
//
//    }

    public abstract void draw();


}

class Flower extends Shape {

    @Override
    public void draw() {

    }
}

class Cycle extends Shape {

    @Override
    public void draw() {

    }
}

class Rect extends Shape {

    @Override
    public void draw() {

    }
}

//1.抽象类使用abstract修饰
//2.抽象类不能实例化
//3.此时在抽象类当中可以有抽象方法和非抽象方法
//4.被abstract修饰，没有具体的实现的方法，就是抽象方法，只要包含抽象方法，这个类一定是抽象类
//5.抽象类就是为了被继承
//6.普通类继承抽象类，必须重写抽象类当中的方法
//7.抽象类可以实现多态
//8.抽象类可以有成员属性，方法，构造方法
//9.抽象方法不能被private修饰，访问权限必须大于private
//10.抽象方法不能被private final static 修饰，一定要满足重写的规则
//11.抽象类的抽象方法必须被重写，子类必须重写父类的抽象方法，如果子类不想重写，则子类必须为抽象类
//12.抽象类当中不一定包含抽象方法


//抽象类和非抽象的区别
//1.抽象类不能实例化，普通类可以
//2.抽象类可以包含非抽象方法和抽象方法，普通类只能包含非抽象方法


//抽象类存在的意义：让代码更安全，编译器的校验 注解也是利用编译器的检验，让代码更安全


abstract class A {

    public void func() {}
}